package org.example.handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.example.vo.HttpResult;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @Author：无敌暴龙战士
 * @Package：org.example.handler
 * @Project：learn_spring_security
 * @name：MyAuthenticationFailureHandler
 * @Date：2025/2/13 0:15
 * @Filename：MyAuthenticationFailureHandler
 * @Description: 失败处理器
 */
@Component
@Slf4j
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {

    @Resource
    ObjectMapper objectMapper;

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {


            //构建一个HTTP响应，将登录成功的消息以JSON格式返回给客户端。
            //1. 创建HttpResult对象
            HttpResult result = HttpResult.builder().code(0).msg("登录失败").build();

            //使用建造者模式（Builder Pattern）创建了一个HttpResult对象。HttpResult对象包含两个字段：code和msg。code表示响应的状态码，


            //2. 将HttpResult对象转换为JSON字符串：

            String responseJSON = objectMapper.writeValueAsString(result);
            //使用objectMapper（通常是一个ObjectMapper实例，用于处理JSON数据）将HttpResult对象转换为JSON格式的字符串。responseJSON变量存储了这个JSON字符串。

            //3. 设置HTTP响应的字符编码和内容类型：
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json;charset=utf-8");
            //设置了HTTP响应的字符编码为UTF-8，并指定了响应的内容类型为application/json;charset=utf-8，表示返回的数据是JSON格式的，并且使用UTF-8编码。

            //4. 获取响应的输出流并写入JSON数据：
            PrintWriter writer = response.getWriter();
            writer.write(responseJSON);
            writer.flush();
            writer.close();

//        - response.getWriter()方法获取HTTP响应的输出流（PrintWriter对象）。
//        - writer.write(responseJSON)将JSON字符串写入输出流。
//        - writer.flush()方法刷新输出流，确保所有数据都被发送到客户端。
//        - writer.close()方法关闭输出流。


    }
}
